package jvmsDb

import (
	"github.com/dgraph-io/badger/v4"
	"log"
)

var rootPath string

func SetPath(path string) {
	rootPath = path
}

func Opendb() *badger.DB {
	opts := badger.DefaultOptions(rootPath + "/badgerdb")
	opts.Dir = rootPath + "/badgerdb/data"      // 数据目录
	opts.ValueDir = rootPath + "/badgerdb/vlog" // 值日志目录
	opts.SyncWrites = false                     // 异步写入（提高性能，但可能丢失最后几秒数据）
	opts.NumMemtables = 5                       // 增加内存表数量
	opts.NumLevelZeroTables = 5                 // L0层最大表数量
	opts.NumLevelZeroTablesStall = 10           // L0层触发压缩的表数量
	opts.ValueLogFileSize = 64 << 20            // 值日志文件大小（64MB）
	db, err := badger.Open(opts)
	if err != nil {
		log.Println("数据库打开失败：%v", err)
	}
	return db
}

func InsertDb(db *badger.DB, key string, value string) {
	err := db.Update(func(tx *badger.Txn) error {
		err := tx.Set([]byte(key), []byte(value))
		return err
	})
	if err != nil {
		log.Println("插入失败: %v", err)
	}

}

// 获取单个键的值
func GetSingleKey(db *badger.DB, key string) string {
	// 使用封装的函数
	var result string
	err := db.View(func(txn *badger.Txn) error {
		return getValueAsString(txn, []byte(key), &result)
	})

	if err != nil {
		log.Println("查询数据失败：%v", err)
	}
	return result
}

func getValueAsString(txn *badger.Txn, key []byte, result *string) error {
	item, err := txn.Get(key)
	if err != nil {
		if err.Error() == "Key not found" {
			return nil

		}
		log.Println("查询数据失败：%v", err)
		return err
	}

	value, err := item.ValueCopy(nil)
	if err != nil {
		log.Println("查询数据失败：%v", err)
		return err
	}
	*result = string(value)
	return nil
}
